package com.xy.ddd.core.repository;

import com.xy.ddd.core.mapper.BaseMapper;
import com.xy.ddd.core.mapper.criteria.LogicCriteria;
import com.xy.ddd.core.model.DomainModel;
import com.xy.ddd.core.model.PageData;

import java.util.List;

/**
 * 仓储服务
 *
 * @param <D>      领域模型实体
 * @param <Mapper> Mapper
 * @author rcx
 */
public interface IRepository<D extends DomainModel, Mapper extends BaseMapper> {

    D findById(long id);

    List<D> find(LogicCriteria criteria);

    /**
     * 分页查询
     * @return
     */
    PageData<D> page(LogicCriteria criteria, long currentPage, int size);

    long saveOrUpdate(D record);

    boolean batchSave(List<D> list);

    /**
     * 根据主键更新属性不为null的值
     * @param record
     * @return
     */
    long update(D record);

    /**
     * 根据Example条件更新实体`record`包含的全部属性，null值会被更新
     *
     * @param record
     * @param example
     * @return
     */
    int updateByExample(D record, LogicCriteria example);

    boolean batchUpdate(List<D> list);

    boolean delete(long id);

    /**
     * 根据实体属性作为条件进行删除，查询条件使用等号
     *
     * @param record
     * @return
     */
    int delete(D record);

    /**
     * 根据Example条件删除数据
     *
     * @param example
     * @return
     */
    int deleteByExample(LogicCriteria example);


}
